## `summarise()` has grouped output by 'seller_id', 'order_id'. You can override
## using the `.groups` argument.
## Warning: There was 1 warning in `summarise()`.
## ℹ In argument: `across(-geolocation_city, mean, na.rm = TRUE)`.
## ℹ In group 1: `geolocation_zip_code_prefix = 1001`, `geolocation_state = "SP"`.
## Caused by warning:
## ! The `...` argument of `across()` is deprecated as of dplyr 1.1.0.
## Supply arguments directly to `.fns` through an anonymous function instead.
##
## # Previously
## across(a:b, mean, na.rm = TRUE)
##
## # Now
## across(a:b, \(x) mean(x, na.rm = TRUE))
## `summarise()` has grouped output by 'geolocation_zip_code_prefix'. You can
## override using the `.groups` argument.
O comércio eletrônico no Brasil experimentou um crescimento significativo nas últimas décadas, tornando-se uma parte essencial do cenário de varejo do país. Com uma população numericamente grande e uma economia em crescimento, o Brasil viu um aumento notável nas transações de comércio eletrônico. Milhões de brasileiros agora preferem fazer compras online, aproveitando a conveniência de encontrar uma ampla variedade de produtos e serviços sem sair de casa. Plataformas de comércio eletrônico e marketplaces desempenham um papel fundamental nesse ecossistema, conectando consumidores a uma vasta gama de vendedores e produtos.
Apesar dos desafios logísticos e de infraestrutura, o comércio eletrônico no Brasil continua a atrair investimentos e inovações. A base de dados “Brazilian E-Commerce Public Dataset by Olist” oferece insights valiosos sobre as transações e comportamento dos consumidores nesse mercado em constante evolução, permitindo análises detalhadas e tomada de decisões informadas.
A fim de entender melhor o comportamento do comércio eletrônico, o trabalho contempla análise com métodos estatísticos explicados na disciplina Regressão Linear, tais como análise descritiva de dados, análise de multicolineareida, entendimentos de valores influentes, verificação de parâmetros da tabela ANOVA, aplicação de teste de hipoteses como Kolmogorov-Smirnov, Breush-Pagan e seleção de modelos, na base de dados da Olist a fim de entender como se relaciona o preço do frete em decorrência de variáveis como tamanho e peso do produto entregue, distância entre compradores e vendedores, data da entrega, dentre outras.
A análise preditiva desempenha um papel crucial na gestão eficaz das operações de comércio eletrônico, especialmente no que diz respeito ao cálculo de frete. A fim de entender melhor o comércio eletrônico brasileiro, foi encontrada a base de dados “Brazilian E-Commerce Public Dataset by Olist” que permite explorar e entender as complexas variáveis que influenciam o custo de frete no contexto do comércio eletrônico no Brasil.
Sendo o frete é um dos principais fatores que impactam a experiência do cliente e os custos operacionais das empresas de comércio eletrônico. Torna-se aprazível buscar calcular da maneira objetiva o custo do frete envolvendo várias variáveis interconectadas, como a quantidade de produtos entregues, o valor do pedido do produto, o volume do pedido, a distância da entrega, a quantidade de dias para entregar o produto e o peso do produto.
Nesse cenário complexo, a regressão linear surge como uma ferramenta para prever os custos de frete com base nessas variáveis. Através da análise preditiva, podemos tentar explorar as relações entre essas variáveis e os custos de frete, identificando tendências e padrões que podem ajudar a tomada de decisões mais clarividentes.
Através da análise de dados da base: “Brazilian E-Commerce Public Dataset by Olist”, é possível entender e justificar a aplicação da análise preditiva por regressão linear a fim de estimar os custos de frete no contexto do comércio eletrônico brasileiro. Com essas estimativas pretende-se fornecer insights valiosos que buscam otimizar processos logísticos, melhorando a satisfação do cliente para que haja a tomada de decisões estratégicas baseadas em dados sólidos.
Durante o curso deste trabalho, iremos analisar cuidadosamente as variáveis disponíveis na base de dados, construir modelos de regressão linear e avaliar sua eficácia na previsão dos custos de frete. Além disso, discutiremos como essa análise pode contribuir para a redução de custos operacionais e a otimização das operações de entrega.
Neste capítulo, detalharemos os materiais e métodos utilizados para desenvolver e analisar nosso modelo de regressão linear múltipla. O objetivo deste estudo é investigar as variáveis que influenciam o valor do frete a ser pago em um e-commerce brasileiro, considerando dados de pedidos realizados entre 2016 e 2018, com uma amostra de cerca de 100.000 pedidos.
Os dados para este estudo foram obtidos do banco de dados de um market place brasileiro, que registra informações detalhadas sobre pedidos realizados entre 2016 e 2018, e disponibilizado na plataforma kaggle para fins de análise pública, através do link:https://www.kaggle.com/datasets/olistbr/brazilian-ecommerce. A fonte de dados foi selecionada devido à sua relevância, para os autores, por se tratar de um problema real, próximo da realidade profissional vivenciadas por eles, devido ao tamanho da base de dados, além de relevante para comunidade ter o entendimento dos fatores que afetam o valor do frete em transações online e uma projeção do quanto pagaria.
Figura 1: Esquemático relacional entre as bases de dados utilizada. Disponível em: https://www.kaggle.com/datasets/olistbr/brazilian-ecommerce
Descrição das bases de dados quem compõem o sistema da Figura 1:
Foram utilizados todos os pedidos observados no banco de dados, desde que tivesse sido “entregue”, não possuisse variáveis nulas ao fazer as combinações com as demais bases de dados, o peso do produto fosse maior que zero, o volume do produto fosse maior que zero, a distância entre vendedor e comprador fosse maior que zero e menor que a maior distancia em linha reta do Brasil (4.394 km), pedido que cujo pagamento não tivesse utilização de voucher. Com aplicação de todas estas restrições foram obtidas 94.995 observações para compor o modelo.
As variáveis utilizadas neste estudo incluem:
Variável Dependente (Y): Valor do Frete - Esta é a variável que pretendemos prever com base nas variáveis independentes.
Variáveis Independentes (X1, X2, X3, …): As variáveis explicativas incluem: - Caracteristicas do Pedido (por exemplo, valor total, quantidade de itens)
Características do Produto (Peso, volume).
Características do Cliente (por exemplo, cep, latitude e longitude).
Características do Vendedor (por exemplo, cidade, localização).
Distância entre CEPs do Cliente e do Vendedor.
Características de tempo (por exemplo, dia da semana da compra, época do ano).
Para realizar a análise, utilizamos um modelo de regressão linear múltipla. buscando encontrar uma equação para o modelo como a seguinte: Frete = β0 + β1X1 + β2X2 + … + βnXn + ε
Onde:
Frete é o valor do frete.
Neste estudo, foi aplicado o método stepwise para seleção de variáveis no modelo. O método stepwise nos permitiu avaliar e selecionar automaticamente as variáveis independentes mais relevantes com base em critérios estatísticos, incluindo o critério BIC (Bayesian Information Criterion). O critério BIC é particularmente útil, pois considera tanto a qualidade de ajuste do modelo quanto a complexidade, ajudando a evitar a inclusão de variáveis desnecessárias e, assim, melhorar a generalização do modelo.
Além disso, foi conduzida uma análise de multicolinearidade entre as variáveis independentes. A multicolinearidade ocorre quando duas ou mais variáveis independentes estão altamente correlacionadas, o que pode prejudicar a interpretação dos coeficientes e a estabilidade do modelo. Durante a análise, identificamos e tratamos a multicolinearidade, quando necessário, para garantir que as variáveis independentes fossem independentes umas das outras.
Adicionalmente, foi realizada uma análise de interação entre variáveis do tipo categóricas (como período do ano da entrega) e variáveis numéricas (Distância entre CEPs). Isso nos permitiu explorar se as relações entre essas variáveis eram afetadas por fatores adicionais, como o tipo de cliente ou a distância geográfica. A inclusão de termos de interação no modelo nos ajudou a capturar essas complexas relações.
Esta abordagem abrangente de seleção de variáveis, análise de multicolinearidade e consideração de interações entre variáveis contribuiu para a construção de um modelo de regressão linear múltipla mais preciso e interpretável, permitindo uma análise mais aprofundada dos determinantes do valor do frete em nosso e-commerce brasileiro.
Antes de ajustar o modelo de regressão linear múltipla, realizamos um rigoroso pré-processamento dos dados para garantir a qualidade e a integridade das informações.
Tratamento de Dados Ausentes: Inicialmente, identificamos e tratamos dados ausentes em todas as variáveis. Isso envolveu a remoção de observações com valores ausentes ou preenchimento desses valores com técnicas apropriadas, como média ou mediana, quando aplicável.
Cálculo da Distância entre CEPs: Para incorporar a distância entre o vendedor e o comprador como uma variável independente no modelo, calculamos a distância geodésica entre dois pontos globais usando suas coordenadas de latitude e longitude. Isso nos permitiu quantificar a distância física entre o vendedor e o comprador para análise.
Agregação de Bases de Dados:
Geolocalização: Para incorporar informações geográficas relevantes, agregamos a base de dados de Geolocalização, calculando a latitude e a longitude média de cada CEP. Isso nos forneceu coordenadas geográficas mais precisas para análise.
OrdersItems: Agregamos a base de dados OrdersItems somando a quantidade de itens por pedido. Isso nos permitiu considerar o volume total de itens em cada pedido como uma variável independente no modelo.
O pré-processamento de dados foi uma etapa crítica para garantir que os dados fossem adequados para a modelagem de regressão e que as informações importantes fossem devidamente incorporadas. Essas transformações e agregações forneceram uma base sólida para a análise estatística e a construção do modelo de regressão linear múltipla.
Para conduzir a análise estatística e a construção do modelo de regressão linear múltipla, utilizamos a linguagem de programação R juntamente com o ambiente de desenvolvimento integrado RStudio. Essas ferramentas forneceram uma plataforma robusta para a análise de dados e modelagem estatística.
Além disso, foram empregados diversos pacotes de R para realizar tarefas específicas, incluindo, mas não se limitando a:
Esses pacotes desempenharam papéis cruciais ao longo da análise, desde a exploração inicial dos dados até a construção e avaliação do modelo de regressão linear múltipla. A escolha dessas ferramentas e pacotes específicos contribuiu para uma análise eficiente e completa dos dados do e-commerce brasileiro.
Nesta seção, foi feita uma análise exploratória das variáveis numéricas que compõem o conjunto de dados. Essa etapa é fundamental para compreender a distribuição das variáveis e suas relações com a variável resposta, o valor do frete.
summary(dfNum$qty_product) #Medidas de Posicao #Q3 - Em um produto
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 1.000 1.000 1.148 1.000 21.000
sd(dfNum$qty_product)
## [1] 0.5600883
hist(dfNum$qty_product) #Histograma - Observa-se que a imensa maioria dos pedidos tem um produto apenas
- Box
Plot: O box plot revela a presença de alguns outlier, mas reforça a
esmagadora concentração nos pedidos com baixa quantidade de
produtos.
boxplot(dfNum$qty_product) #Box-plot - ratifica o ponto acima
-
Correlação de Pearson: A correlação de Pearson foi de 0,35, indicando
uma correçação positiva fraca entra as variáveis (frete e quantidade de
produtos)
with(dfNum, cor(qty_product, total_freight, method="pearson")) #[1] 0.3500383
## [1] 0.3500383
summary(dfNum$total_price) #Medidas de Posicao - Existe valores de pedidos muito alto - 13400 reais - uma observacao - valor quase o dobro da segunda maior
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.85 44.99 82.99 133.46 149.00 13440.00
sd(dfNum$total_price) #Desvio-padrao [1] 203.787
## [1] 206.0986
hist(dfNum$total_price) #Histograma
- Box
Plot: : box plot revela a presença de alguns outlier, mas reforça a
esmagadora concentração nos pedidos de até 1000 reais.
boxplot(dfNum$total_price) #Box-plot
-
Correlação de Pearson: A correlação de Pearson entre total_price e
total_freight foi de 0,41, indicando correlção positiva moderada.
with(dfNum, cor(total_price, total_freight, method="pearson")) #[1] 0.4074545
## [1] 0.4074545
summary(dfNum$volume) #Medidas de Posicao
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 168 2816 6384 15190 18375 296208
sd(dfNum$volume) #Desvio-padrao [1] 23267.38 - alta dispersao
## [1] 23355.12
hist(dfNum$volume) #Histograma
- Box
Plot: O box plot mostra presença de outilier, mas dados bem concentrados
em pedidos até 50.000 cm3.
boxplot(dfNum$volume) #Box-plot
-
Correlação de Pearson: A correlação de Pearson entre volume e
total_freight foi de 0,49, inficando correção moderada entre as
variáveis. Uma das correlações mais altas encontradas neste estudo.
with(dfNum, cor(volume, total_freight, method="pearson")) #0.4998182
## [1] 0.4998182
summary(dfNum$dist) #Medidas de Posicao
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 51 186422 434215 600114 797852 3931806
sd(dfNum$dist) #Desvio-padrao [1] 592318.2 - alta dispersao
## [1] 591850.6
hist(dfNum$dist) #Histograma
- Box
Plot: O box plot mostra presença de alguns outliers, mas com p75 abaixo
de 1.000. km
boxplot(dfNum$dist) #Box-plot - cerca de 4 observacoes muito distantes - mais de 8mil km de distancia - muito superior a distancia do brasil - Excluir observacoes
-
Correlação de Pearson: A correlação de Pearson entre dist e
total_freight foi de 0,32, indicando correlação fraca entre as
variáveis.
with(dfNum, cor(dist, total_freight, method="pearson")) #0.3259257
## [1] 0.3259257
summary(dfNum$tempoEntregaNum) #Medidas de Posicao #Atencao para casos com mais de 120 dias de tempo de entrega - o estimado é 50 dias
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.5334 6.7169 10.1754 12.4994 15.5945 209.6286
sd(dfNum$tempoEntregaNum) #Desvio-padrao [1] 9.524263
## [1] 9.522234
hist(dfNum$tempoEntregaNum) #Histograma
- Box
Plot: O box plot apresena alguns outliers com p75 com tempo inferior a
~20.
boxplot(dfNum$tempoEntregaNum) #Box-plot
-
Correlação de Pearson: A correlação de Pearson entre tempoEntregaNum e
total_freight foi de 0,17, indicando correlação bem fraca entre as
variáveis, a mais fraca encontrada.
with(dfNum, cor(tempoEntregaNum, total_freight, method="pearson"))
## [1] 0.1785367
summary(dfNum$product_weight_g) #Medidas de Posicao
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2 300 700 2100 1800 40425
sd(dfNum$product_weight_g)
## [1] 3754.123
hist(dfNum$product_weight_g) #Histograma - concentracao alta em produtos com ate 2kgs
- Box
Plot: O box plot indica a presença clara de outlier no valor de peso ~30
kg e outros.
boxplot(dfNum$product_weight_g) #Box-plot existe um produto com mais de 40kg - atencao - produtos com 0 e 2g - estes tem erro na coleta de dados
-
Correlação de Pearson: correlação de Pearson entre product_weight_g e
total_freight foi de 0,52, indicado correlação moderada entre os dados,
sendo a correlação de pearson mais alta.
with(dfNum, cor(product_weight_g, total_freight, method="pearson")) #0.5219245
## [1] 0.5219245
summary(dfNum$total_freight)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 5.00 13.65 16.95 22.20 23.34 1794.96
sd(dfNum$total_freight)
## [1] 20.56356
hist(dfNum$total_freight)
- Box
Plot: O box plot [indicar se há outliers ou assimetria na
distribuição].
boxplot(dfNum$total_freight)
Realizamos análises de correlação de Pearson individual entre cada uma das variáveis explicativas (qty_product, total_price, volume, dist, tempoEntregaNum, product_weight_g) e a variável resposta (total_freight). As correlações variaram de 0.178 a 0.522 e apresentaram correlações fracas ou moderadas com direção positiva, em todas as variaveis numericas testadas.
Essa análise exploratória de dados nos forneceu uma compreensão inicial das distribuições das variáveis, identificou possíveis outliers e nos permitiu avaliar a correlação entre as variáveis explicativas e a variável resposta, o que será fundamental para a construção e interpretação do modelo de regressão linear múltipla.
Para investigar a possível interação entre as variáveis dist, total_price, volume e o fator periodo_ano_estima_entrega, realizamos uma análise de interação. Isso nos permitiu examinar se o efeito de uma variável numérica no valor do frete é modificado ou dependente do nível do fator de período do ano estimado de entrega.
ggplot(dfNum, aes(x = dist, y = total_freight, color=periodo_ano_estima_entrega)) + #Plota grafico
geom_point(size=2, shape=16) + #Muda padrao dos pontos
scale_color_manual(values=c("violetred", "royalblue", "green", "yellow")) + #Muda cores
geom_smooth(method = "lm", se=FALSE)#Coloca linhas - Nota-se uma interacao entre Volume e o periodo do ano que a entrega é feita
## `geom_smooth()` using formula = 'y ~ x'
ggplot(dfNum, aes(x = total_price, y = total_freight, color=periodo_ano_estima_entrega)) + #Plota grafico
geom_point(size=2, shape=16) + #Muda padrao dos pontos
scale_color_manual(values=c("violetred", "royalblue", "green", "yellow")) + #Muda cores
geom_smooth(method = "lm", se=FALSE)#Coloca linhas - Nota-se uma interacao entre Volume e o periodo do ano que a entrega é feita
## `geom_smooth()` using formula = 'y ~ x'
ggplot(dfNum, aes(x = volume, y = total_freight, color=periodo_ano_estima_entrega)) + #Plota grafico
geom_point(size=2, shape=16) + #Muda padrao dos pontos
scale_color_manual(values=c("violetred", "royalblue", "green", "yellow")) + #Muda cores
geom_smooth(method = "lm", se=FALSE)#Coloca linhas - Nota-se uma interacao entre Volume e o periodo do ano que a entrega é feita
## `geom_smooth()` using formula = 'y ~ x'
Essa análise de interação entre as variáveis numéricas (dist, total_price, volume) e o fator periodo_ano_estima_entrega nos permitiu compreender melhor como essas variáveis podem influenciar de forma conjunta o valor do frete em diferentes momentos do ano estimado de entrega. Esses insights serão úteis para a construção de modelos de regressão mais precisos e para a interpretação dos resultados finais. Trazendo a necessidade de testar no modelo a interação entre total_price e volume com a variável (fator) periodo_ano_estima_entrega.
Para analisar os determinantes do valor do frete em nosso e-commerce brasileiro, realizamos uma modelagem de regressão linear múltipla. Utilizamos a linguagem de programação R com a função lm() para construir o modelo. A fórmula utilizada para o modelo foi a seguinte:
[lm(total_freight ~ product_weight_g + volume + dist + tempoEntregaNum + qty_product + total_price + factor(periodo_ano_estima_entrega) + volume:factor(periodo_ano_estima_entrega) + total_price:factor(periodo_ano_estima_entrega), data = dfNum)]
Nesta fórmula, total_freight é a variável dependente que estamos tentando prever, enquanto as outras variáveis são as variáveis independentes que consideramos relevantes com base na análise exploratória de dados. Vamos explicar cada parte da fórmula:
product_weight_g, volume, dist, tempoEntregaNum, qty_product e total_price são as variáveis numéricas que incluímos como preditores no modelo.
factor(periodo_ano_estima_entrega) representa o fator categórico que indica o período do ano estimado de entrega. Ele foi incluído no modelo para capturar as possíveis variações sazonais nas relações entre as variáveis independentes e a variável dependente.
As interações entre variáveis foram modeladas com volume:factor(periodo_ano_estima_entrega) e total_price:factor(periodo_ano_estima_entrega). Isso permite que o efeito das variáveis numéricas (volume e total_price) no valor do frete varie de acordo com o período do ano estimado de entrega.
Ao ajustar o modelo de regressão linear múltipla, consideramos a significância estatística dos coeficientes, a multicolinearidade entre as variáveis independentes e realizamos testes de hipóteses para avaliar a qualidade do ajuste do modelo.
Os resultados da modelagem de regressão linear forneceram importantes insights sobre os determinantes do valor do frete em nosso e-commerce brasileiro. Alguns dos principais resultados incluem:
Efeito das Variáveis Numéricas: As variáveis numéricas, como o peso do produto (product_weight_g), o volume e o preço total, mostraram-se estatisticamente significativas na previsão do valor do frete. Isso sugere que aumentos nessas variáveis estão associados a aumentos ou diminuições no valor do frete, dependendo de suas direções de efeito.
Efeito do Período do Ano Estimado de Entrega: A inclusão do fator categórico do período do ano estimado de entrega revelou variações sazonais nas relações entre as variáveis independentes e o valor do frete. Isso indica que o período do ano pode influenciar a dinâmica dos custos de frete.
Interações Significativas: As interações entre as variáveis numéricas (volume e preço total) e o fator do período do ano estimado de entrega foram estatisticamente significativas. Isso significa que o efeito dessas variáveis na determinação do valor do frete pode variar sazonalmente.
Esses resultados são fundamentais para entender como as características dos produtos, as distâncias entre CEPs, os tempos de entrega e os preços afetam o valor do frete em nosso e-commerce brasileiro. Eles também fornecem informações valiosas para a tomada de decisões e estratégias de preços sazonais. A seguir, apresentaremos uma interpretação mais detalhada dos coeficientes e medidas de ajuste do modelo.
A seleção de variáveis é uma etapa crítica na construção de um modelo de regressão linear múltipla. O objetivo é identificar quais variáveis independentes são mais relevantes para prever a variável dependente, neste caso, o valor do frete (total_freight). Para realizar essa seleção de forma sistemática, utilizamos o método stepwise com o critério BIC.
foi usada a formula step(modelo_num, direction = ‘both’, k = log(n)) e com isto obtido o seguinte modelo:
modelo_num = lm(total_freight ~ product_weight_g+volume+dist+tempoEntregaNum+qty_product+total_price+factor(periodo_ano_estima_entrega)+volume:factor(periodo_ano_estima_entrega)+total_price:factor(periodo_ano_estima_entrega), data = dfNum)
No modelo 1, o R2 ajustado foi
de 0.5618, e o termo do erro (sigma2) 185.2557. Fazendo a analise de
VIF, não são observadas variaveis que tenham valor acima do treshold
definido (5). Ou seja, pode-se continuar com todas as variáveis
definidas. Observando o teste t, ao usar o comando summary(modelo1),
ve-se que todas as variaveis tem p-valor abaixo de 5%, ou seja, devem
fazer parte do modelo.
n <- nrow(dfNum)
#METODO DE SELECAO DE MODELO - USANDO BIC como critério
modelo_numStep <- step(modelo_num, direction = 'both', k = log(n))
## Start: AIC=496206.3
## total_freight ~ product_weight_g + volume + dist + tempoEntregaNum +
## qty_product + total_price + factor(periodo_ano_estima_entrega) +
## volume:factor(periodo_ano_estima_entrega) + total_price:factor(periodo_ano_estima_entrega)
##
## Df Sum of Sq RSS AIC
## <none> 17595400 496206
## - total_price:factor(periodo_ano_estima_entrega) 3 17001 17612401 496264
## - tempoEntregaNum 1 16297 17611698 496283
## - volume:factor(periodo_ano_estima_entrega) 3 94211 17689612 496679
## - product_weight_g 1 1138206 18733607 502149
## - dist 1 3215040 20810440 512137
## - qty_product 1 4482452 22077852 517753
vif(modelo_num)
## there are higher-order terms (interactions) in this model
## consider setting type = 'predictor'; see ?vif
## GVIF Df GVIF^(1/(2*Df))
## product_weight_g 2.953965 1 1.718710
## volume 6.459525 1 2.541559
## dist 1.206838 1 1.098562
## tempoEntregaNum 1.261367 1 1.123106
## qty_product 1.013721 1 1.006837
## total_price 6.169302 1 2.483808
## factor(periodo_ano_estima_entrega) 4.695082 3 1.294019
## volume:factor(periodo_ano_estima_entrega) 12.748137 3 1.528414
## total_price:factor(periodo_ano_estima_entrega) 15.273105 3 1.575147
summary(modelo_num)$adj.r.squared #[1] 0.5618984
## [1] 0.5618984
summary(modelo_num)
##
## Call:
## lm(formula = total_freight ~ product_weight_g + volume + dist +
## tempoEntregaNum + qty_product + total_price + factor(periodo_ano_estima_entrega) +
## volume:factor(periodo_ano_estima_entrega) + total_price:factor(periodo_ano_estima_entrega),
## data = dfNum)
##
## Residuals:
## Min 1Q Median 3Q Max
## -248.62 -3.62 0.41 3.12 1618.20
##
## Coefficients:
## Estimate Std. Error
## (Intercept) -7.795e+00 1.632e-01
## product_weight_g 1.585e-03 2.022e-05
## volume 1.324e-04 4.806e-06
## dist 1.080e-05 8.197e-08
## tempoEntregaNum 4.885e-02 5.209e-03
## qty_product 1.235e+01 7.939e-02
## total_price 1.643e-02 5.322e-04
## factor(periodo_ano_estima_entrega)2 Tri 2.417e-01 1.583e-01
## factor(periodo_ano_estima_entrega)3 Tri 3.157e-01 1.571e-01
## factor(periodo_ano_estima_entrega)4 Tri -5.319e-01 1.826e-01
## volume:factor(periodo_ano_estima_entrega)2 Tri 3.774e-05 5.498e-06
## volume:factor(periodo_ano_estima_entrega)3 Tri 1.181e-04 5.491e-06
## volume:factor(periodo_ano_estima_entrega)4 Tri 4.554e-05 6.350e-06
## total_price:factor(periodo_ano_estima_entrega)2 Tri 1.918e-03 6.637e-04
## total_price:factor(periodo_ano_estima_entrega)3 Tri 5.181e-03 6.651e-04
## total_price:factor(periodo_ano_estima_entrega)4 Tri -2.716e-05 7.300e-04
## t value Pr(>|t|)
## (Intercept) -47.763 < 2e-16 ***
## product_weight_g 78.384 < 2e-16 ***
## volume 27.546 < 2e-16 ***
## dist 131.737 < 2e-16 ***
## tempoEntregaNum 9.379 < 2e-16 ***
## qty_product 155.551 < 2e-16 ***
## total_price 30.867 < 2e-16 ***
## factor(periodo_ano_estima_entrega)2 Tri 1.527 0.12688
## factor(periodo_ano_estima_entrega)3 Tri 2.010 0.04442 *
## factor(periodo_ano_estima_entrega)4 Tri -2.913 0.00358 **
## volume:factor(periodo_ano_estima_entrega)2 Tri 6.864 6.73e-12 ***
## volume:factor(periodo_ano_estima_entrega)3 Tri 21.510 < 2e-16 ***
## volume:factor(periodo_ano_estima_entrega)4 Tri 7.171 7.50e-13 ***
## total_price:factor(periodo_ano_estima_entrega)2 Tri 2.890 0.00386 **
## total_price:factor(periodo_ano_estima_entrega)3 Tri 7.790 6.76e-15 ***
## total_price:factor(periodo_ano_estima_entrega)4 Tri -0.037 0.97033
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 13.61 on 94979 degrees of freedom
## Multiple R-squared: 0.562, Adjusted R-squared: 0.5619
## F-statistic: 8123 on 15 and 94979 DF, p-value: < 2.2e-16
summary(modelo_num)$sigma^2 #185.2557
## [1] 185.2557
#anova(modelo_num)
### Analise de Resíduos
Após a construção do modelo de regressão linear múltipla, é fundamental realizar uma análise de resíduos para verificar se o modelo atende aos pressupostos da regressão linear e identificar possíveis problemas que possam afetar a qualidade das previsões.
O gráfico QQ plot é uma ferramenta visual que compara os resíduos do modelo com uma distribuição teórica, geralmente a distribuição normal. Um QQ plot bem comportado exibirá pontos próximos a uma linha reta, indicando que os resíduos estão próximos de uma distribuição normal. Desvios significativos da linha reta podem sugerir desvios da normalidade.
residuos <- modelo_numStep$residuals #Calcula o vetor de residuos
preditos <- predict(modelo_numStep) #Calcula os valores preditos
qqnorm(residuos) ; qqline(residuos) #Grafico de probabilidade normal
No qqplot já é possivel observar a ausencia de normalidade dos resíduos, mas ainda sim é necessario realizar o teste de hipotese para tal
O teste de Kolmogorov-Smirnov é uma ferramenta estatística para verificar se os resíduos seguem uma distribuição normal. O teste compara a distribuição acumulada empírica dos resíduos com a distribuição acumulada teórica esperada (normal). Se o valor-p associado ao teste for significativo, isso indicará que os resíduos não seguem uma distribuição normal. Ao longo do curso foi usado o teste de Shapiro-wilk, porém no cenario observado pelos alunos tal ferramenta não pode ser utilizada, visto que o dataframe possui mais de 5000 observações, desta forma superando o limite máximo do teste. O p-valor do teste, um numero infinitamente pequeno, ratifica o fato observado no qqplot, que os residuos não seguem uma distribuição normal.
ks.test(residuos, "pnorm", mean=mean(residuos), sd=sd(residuos))
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: residuos
## D = 0.21774, p-value < 2.2e-16
## alternative hypothesis: two-sided
A homocedasticidade refere-se à igualdade da variância dos resíduos em diferentes níveis das variáveis independentes. O teste de Breusch-Pagan é utilizado para verificar a homocedasticidade dos resíduos. Se o valor-p associado ao teste for significativo, isso sugere que a variância dos resíduos não é constante, o que pode indicar um problema de heterocedasticidade. Observando tanto o gráfico de Ajustados vs. Residuos, quanto o resultado do teste de Breush-pagan, vemos que os resudios nao tem homocedacidade, valor-p do teste, assim como visto no KS, é um numero muito pequeno o que faz rejeitar a hipotese nula.
plot(preditos, residuos, main="Ajustados vs. Residuos")
abline(h=0)
bptest(modelo_numStep) #Breusch-Pagan teste (avalia homogeneidade da variancia dos erros quando explicativa e' quantativa)
##
## studentized Breusch-Pagan test
##
## data: modelo_numStep
## BP = 910.42, df = 15, p-value < 2.2e-16
Além da análise visual e dos testes estatísticos, é importante avaliar a relação entre a ordem das observações e os resíduos. Se houver algum padrão nos resíduos em relação à ordem das observações, isso pode indicar a presença de autocorrelação nos resíduos, o que é um problema que pode afetar a validade das inferências do modelo. Com a base de dados e o modelo obtido, nesta primeira tantativa, nao é identificado anomalias quanto a ordem e resíduos.
plot(1:nrow(dfNum), residuos, main="Ordem vs. Residuos", xlab="Ordem")
abline(h=0)
Como os resíduos observados não respeitam a distribuição normal e não são homocedásticos, é necessário seguir com a proposição para ajustes no modelo.
A transformação Box-Cox é uma técnica estatística usada para lidar com variáveis dependentes que não atendem aos pressupostos da regressão linear, como normalidade e homocedasticidade. Esta transformação é aplicada à variável dependente (nesse caso, o valor do frete - total_freight) com o objetivo de tornar os resíduos mais próximos de uma distribuição normal, atendendo aos pressupostos da regressão linear.
Benefícios Esperados. Ao aplicar a transformação Box-Cox à variável dependente, esperamos obter os seguintes benefícios:
Melhoria na Normalidade: A transformação Box-Cox pode ajudar a tornar os resíduos mais próximos de uma distribuição normal. Isso é importante, pois muitos testes estatísticos e pressupostos da regressão linear dependem da normalidade dos resíduos.
Estabilização da Variância: Em alguns casos, a transformação Box-Cox pode ajudar a estabilizar a variância dos resíduos, tornando-os homocedásticos. Isso é importante para garantir que os erros de previsão não dependam do valor previsto.
Melhoria nas Propriedades Estatísticas: A transformação pode melhorar as propriedades estatísticas dos resíduos, como a independência e a distribuição normal, o que pode levar a intervalos de confiança e testes de hipóteses mais válidos.
Perda de Interpretação. No entanto, é importante observar que a transformação Box-Cox também possui algumas desvantagens:
Perda de Interpretação Direta: A transformação Box-Cox altera a escala e a interpretação da variável dependente transformada. Isso significa que os coeficientes estimados no modelo transformado não podem ser diretamente interpretados em termos das unidades originais da variável. A interpretação dos resultados deve ser feita com base na escala transformada.
Complexidade: A transformação Box-Cox introduz uma etapa adicional de complexidade no modelo, pois é necessário inverter a transformação para obter previsões na escala original, se necessário.
A decisão de aplicar a transformação Box-Cox deve ser baseada em evidências da análise de resíduos, como visto na subsessão anterior, a análise inicial dos resíduos revelou desvios significativos dos pressupostos da regressão linear, a transformação é ser uma opção. Com isto foi feito o modelo2, em que seguimos usando o método step-wise e BIC como critério para seleção de variáveis.
boxcox1 <- with(dfNum, boxCox(total_freight ~ product_weight_g+volume+dist+tempoEntregaNum+qty_product+total_price+factor(periodo_ano_estima_entrega)+volume:factor(periodo_ano_estima_entrega)+total_price:factor(periodo_ano_estima_entrega),
lambda = seq(-5, 5, by=0.01),
plotit=TRUE)) #Salvando os resultados numericos do boxcox
lambda <- boxcox1$x[which.max(boxcox1$y)] #Valor de 'lambda' que maximiza a 'profile log-likelihood'
print(lambda)
## [1] -0.1515152
dfNum$total_freight_boxcox <- (dfNum$total_freight^lambda - 1)/lambda
modelo_num2 <- lm(total_freight_boxcox ~ product_weight_g+volume+dist+tempoEntregaNum+qty_product+total_price+factor(periodo_ano_estima_entrega)+volume:factor(periodo_ano_estima_entrega)+total_price:factor(periodo_ano_estima_entrega), data=dfNum)
#METODO DE SELECAO DE MODELO - USANDO BIC como critério
modelo_numStep2 <- step(modelo_num2, direction = 'both', k = log(n))
## Start: AIC=-301860.8
## total_freight_boxcox ~ product_weight_g + volume + dist + tempoEntregaNum +
## qty_product + total_price + factor(periodo_ano_estima_entrega) +
## volume:factor(periodo_ano_estima_entrega) + total_price:factor(periodo_ano_estima_entrega)
##
## Df Sum of Sq RSS AIC
## <none> 3952.1 -301861
## - total_price:factor(periodo_ano_estima_entrega) 3 2.05 3954.1 -301846
## - volume:factor(periodo_ano_estima_entrega) 3 5.87 3958.0 -301754
## - tempoEntregaNum 1 54.05 4006.1 -300582
## - product_weight_g 1 391.99 4344.1 -292889
## - qty_product 1 881.72 4833.8 -282741
## - dist 1 2002.84 5954.9 -262927
vif(modelo_num2)
## there are higher-order terms (interactions) in this model
## consider setting type = 'predictor'; see ?vif
## GVIF Df GVIF^(1/(2*Df))
## product_weight_g 2.953965 1 1.718710
## volume 6.459525 1 2.541559
## dist 1.206838 1 1.098562
## tempoEntregaNum 1.261367 1 1.123106
## qty_product 1.013721 1 1.006837
## total_price 6.169302 1 2.483808
## factor(periodo_ano_estima_entrega) 4.695082 3 1.294019
## volume:factor(periodo_ano_estima_entrega) 12.748137 3 1.528414
## total_price:factor(periodo_ano_estima_entrega) 15.273105 3 1.575147
É observado um lambda = -0.1515152 (dízima periódica), o que torna complexa a interpretação da variável resposta, porém dado o p-valor muito pequeno, observado na primeira análise de resíduos, será adotado o valor de lambda na transformação exata, sem aproximações em uma primeira tentativa. Neste cenário transformado, obtemos um melhor ajuste do modelo, observando o R2 Ajustado, que sai de 0.52 para 0.64. Além disto, o termo do erro (sigma2) sai de 185.25, para 0.0416, uma drástica redução. É um ganho representativo, embora se perca a interpretabilidade, visto que o valor do frete agora precisa ser interpretado como Frete elevado a -0.1515152, subtraido de 1 e por fim, dividido por -0.1515152!
Da mesma maneira que foi explicado na sessão anterior, foi realizado novamente, agora para o modelo2, o teste de Kolmogorov-Smirnov, para avaliar a normalidade dos resíduos do modelo obtido após transformação de box-cox da variavel dependente. E assim como no primeiro teste, pode-se rejeitar a hipótese nula de que os residuos do modelo2 respeitam uma distribuição normal.
residuos2 <- modelo_numStep2$residuals #Calcula o vetor de residuos
preditos2 <- predict(modelo_numStep2) #Calcula os valores preditos
qqnorm(residuos2) ; qqline(residuos2) #Grafico de probabilidade normal
ks.test(residuos2, "pnorm", mean=mean(residuos2), sd=sd(residuos2))
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: residuos2
## D = 0.053145, p-value < 2.2e-16
## alternative hypothesis: two-sided
####Nova analise de Residuos - Teste de Breusch-Pagan para Homocedasticidade Refeito o teste de Breusch-Pagan para avaliar a homocedacidade dos resíduos e a h0 segue sendo rejeitada, os resíduos obtidos a partir do modelo2 não possuem variância constante.
plot(preditos2, residuos2, main="Ajustados vs. Residuos")
abline(h=0)
bptest(modelo_num2) #Breusch-Pagan teste (avalia homogeneidade da variancia dos erros quando explicativa e' quantativa)
##
## studentized Breusch-Pagan test
##
## data: modelo_num2
## BP = 13849, df = 15, p-value < 2.2e-16
Com a base de dados e o modelo obtido, na segunda tantativa, nao é identificado anomalias quanto a ordem e resíduos.
plot(1:nrow(dfNum), residuos, main="Ordem vs. Residuos", xlab="Ordem")
abline(h=0)
Como os resíduos observados não respeitam a distribuição normal e não são homocedásticos, é necessário seguir com a proposição para ajustes no modelo, agora serão analisados e possívelmente removidos as observações de grande influência.
Após a tentativa de normalizar os resíduos por meio da transformação Box-Cox, é possível que ainda existam observações que tenham um impacto desproporcional nos resultados do modelo de regressão linear. Essas observações são chamadas de “observações influentes” e podem distorcer a análise estatística e as previsões do modelo. Os hat values são medidas que indicam o grau de influência de cada observação nos valores ajustados pelo modelo de regressão. Eles refletem o quanto cada observação se afasta da média dos valores das variáveis independentes. Observações com hat values altos têm um impacto maior nas estimativas dos coeficientes do modelo e, consequentemente, nas previsões. Para identificar observações influentes, foram calculados os hat values para cada observação em nosso conjunto de dados. Observações com hat values significativamente maiores do que a média dos hat values podem ser consideradas influentes.
Hii <- hatvalues(modelo_numStep2)
boxplot(Hii)
a.Hii <- dfNum$OBS[Hii > 4*p/n]
dfPontoAlav <- dfNum[a.Hii,]
head(dfPontoAlav)
## customer_city customer_state total_price total_freight
## 2 santa fe do sul SP 239.90 19.93
## 8 praia grande SP 810.00 70.75
## 75 belo horizonte MG 225.00 67.24
## 110 brasilia DF 179.99 85.97
## 163 anapolis GO 253.52 82.86
## 282 cosmopolis SP 1050.61 25.13
## seller_city seller_state product_category_name product_weight_g
## 2 sao paulo SP pet_shop 30000
## 8 presidente prudente SP ferramentas_jardim 13805
## 75 itatiba SP bebes 23250
## 110 itaquaquecetuba SP moveis_decoracao 28600
## 163 ibitinga SP moveis_decoracao 19200
## 282 sao paulo SP cama_mesa_banho 18800
## product_length_cm product_height_cm product_width_cm dataPedido
## 2 50 30 40 2017-04-26 10:53:06
## 8 35 75 45 2018-07-04 12:08:27
## 75 23 50 84 2018-03-25 16:52:27
## 110 41 43 91 2017-09-21 22:00:44
## 163 58 40 50 2017-11-06 15:42:42
## 282 40 30 50 2018-05-04 19:19:10
## dataEstimada dist volume tempoEntregaNum mes_pedido mes_estima_entrega
## 2 2017-05-15 586219.9 60000 16.216181 4 5
## 8 2018-07-25 548720.3 118125 5.080324 7 7
## 75 2018-04-20 449061.4 96600 21.949560 3 4
## 110 2017-10-20 868688.3 160433 20.603646 9 10
## 163 2017-11-29 604625.0 116000 15.140417 11 11
## 282 2018-05-17 113864.7 60000 12.151100 5 5
## periodo_mes_pedido periodo_mes_estima_entrega periodo_ano_pedido
## 2 fim do mês meio do mês 2 Tri
## 8 inicio do mês fim do mês 3 Tri
## 75 fim do mês meio do mês 1 Tri
## 110 meio do mês meio do mês 3 Tri
## 163 meio do mês fim do mês 4 Tri
## 282 inicio do mês meio do mês 2 Tri
## periodo_ano_estima_entrega diaSemana_pedido TipoDiaSemana_pedido
## 2 2 Tri 4 dia util
## 8 3 Tri 4 dia util
## 75 2 Tri 1 fim de semana
## 110 4 Tri 5 dia util
## 163 4 Tri 2 dia util
## 282 2 Tri 6 dia util
## qty_product total_freight_boxcox OBS residuos r.stand r.stud r.stud.ext
## 2 1 2.405802 2 -54.138 -4.099 -4.101 -4.102
## 8 1 3.138356 8 -9.263 0.132 0.132 0.132
## 75 1 3.111565 75 -0.883 0.151 0.151 0.151
## 110 1 3.239058 110 -5.258 -1.293 -1.295 -1.295
## 163 1 3.220242 163 16.347 0.797 0.797 0.797
## 282 1 2.550573 282 -40.763 -2.154 -2.155 -2.155
## r.press Hii d.Cook df.beta0 df.beta1 df.beta2 df.beta3 df.beta4 df.beta5
## 2 -0.837 0.001 0.001 -0.002 -0.134 0.068 -0.002 0.002 0.000
## 8 0.027 0.001 0.000 0.000 0.000 0.000 0.000 0.000 0.000
## 75 0.031 0.001 0.000 0.000 0.002 -0.001 0.000 0.000 0.000
## 110 -0.264 0.003 0.000 0.000 -0.017 0.009 -0.002 0.001 0.000
## 163 0.163 0.001 0.000 0.001 0.006 -0.003 0.000 -0.001 0.000
## 282 -0.440 0.001 0.000 -0.004 -0.030 0.015 0.006 0.000 0.004
## df.beta6 df.beta7 df.fits
## 2 0.014 0.003 -0.144
## 8 0.000 0.000 0.004
## 75 0.000 0.000 0.004
## 110 0.002 0.000 -0.069
## 163 -0.001 0.000 0.029
## 282 0.003 0.014 -0.065
Deste modo observa-se registros com alto grau de influencia, segundo convensão, toma-se hat values influentes quando Hii é maior que 2 vezes a razão entre quantidade de parâmetros sobre a quantidade da amostra, e neste estudo, para fins de conservadorismo e por ter o tamanho amostral de aproximadamente 95 mil, o que torna complexo e caro analisar individualmente as observações, priorizou-se as observações deveras influente.
Além dos hat values, também foram calculados e analisados os Resíduos Studentizados, que são resíduos que foram padronizados para terem uma média de 0 e um desvio padrão de 1. Isso os torna úteis para identificar observações que se desviam significativamente do padrão esperado. Os Resíduos Studentizados são frequentemente usados para verificar a presença de valores atípicos ou observações influentes. Valores absolutos dos Resíduos Studentizados significativamente maiores que 2 indicam observações que merecem uma análise mais aprofundada. Com esta caracteristicas sao identificados mais de 4300 observações.
boxplot(r.stud)
a.r.stud <- dfNum$OBS[abs(r.stud) > 2]
#dfNum[a.r.stud,] #ponto de alavanca
dfRStud <- dfNum[a.r.stud,]
head(dfRStud)
## customer_city customer_state total_price total_freight seller_city
## 2 santa fe do sul SP 239.90 19.93 sao paulo
## 67 ituiutaba MG 199.99 65.56 sao paulo
## 72 porto alegre RS 44.90 7.16 sao paulo
## 91 rio de janeiro RJ 138.00 37.16 guaruja
## 123 rio de janeiro RJ 149.00 40.37 ilicinea
## 141 nilopolis RJ 139.00 87.28 arapongas
## seller_state product_category_name product_weight_g product_length_cm
## 2 SP pet_shop 30000 50
## 67 SP cool_stuff 2050 40
## 72 SP brinquedos 200 16
## 91 SP perfumaria 250 16
## 123 MG informatica_acessorios 6550 20
## 141 PR bebes 4075 73
## product_height_cm product_width_cm dataPedido dataEstimada
## 2 30 40 2017-04-26 10:53:06 2017-05-15
## 67 40 30 2017-06-20 21:55:21 2017-07-12
## 72 7 11 2017-08-04 09:19:10 2017-09-05
## 91 10 11 2018-06-13 14:10:54 2018-07-20
## 123 20 20 2018-02-19 21:47:44 2018-03-14
## 141 14 48 2018-06-10 19:52:27 2018-07-16
## dist volume tempoEntregaNum mes_pedido mes_estima_entrega
## 2 586219.9 60000 16.216181 4 5
## 67 593807.9 48000 8.709884 6 7
## 72 870113.5 1232 3.408565 8 9
## 91 331550.4 1760 5.974780 6 7
## 123 318392.9 8000 15.910301 2 3
## 141 821947.0 49056 5.823854 6 7
## periodo_mes_pedido periodo_mes_estima_entrega periodo_ano_pedido
## 2 fim do mês meio do mês 2 Tri
## 67 meio do mês meio do mês 2 Tri
## 72 inicio do mês inicio do mês 3 Tri
## 91 meio do mês meio do mês 2 Tri
## 123 meio do mês meio do mês 1 Tri
## 141 meio do mês meio do mês 2 Tri
## periodo_ano_estima_entrega diaSemana_pedido TipoDiaSemana_pedido
## 2 2 Tri 4 dia util
## 67 3 Tri 3 dia util
## 72 3 Tri 6 dia util
## 91 3 Tri 4 dia util
## 123 1 Tri 2 dia util
## 141 3 Tri 1 fim de semana
## qty_product total_freight_boxcox OBS residuos r.stand r.stud r.stud.ext
## 2 1 2.405802 2 -54.138 -4.099 -4.101 -4.102
## 67 1 3.098166 67 34.259 3.227 3.227 3.227
## 72 2 1.702080 72 -21.216 -3.699 -3.699 -3.699
## 91 2 2.783602 91 12.251 2.138 2.138 2.138
## 123 1 2.831212 123 17.714 2.378 2.378 2.378
## 141 1 3.246750 141 51.501 3.472 3.472 3.473
## r.press Hii d.Cook df.beta0 df.beta1 df.beta2 df.beta3 df.beta4 df.beta5
## 2 -0.837 0.001 0.001 -0.002 -0.134 0.068 -0.002 0.002 0.000
## 67 0.658 0.000 0.000 0.002 -0.021 0.010 0.001 -0.002 -0.003
## 72 -0.755 0.000 0.000 0.008 -0.001 0.000 -0.010 0.011 -0.019
## 91 0.436 0.000 0.000 -0.004 0.000 0.000 -0.002 -0.001 0.010
## 123 0.485 0.000 0.000 0.011 0.018 -0.014 -0.004 0.002 -0.002
## 141 0.708 0.000 0.000 0.003 -0.012 0.006 0.008 -0.008 -0.003
## df.beta6 df.beta7 df.fits
## 2 0.014 0.003 -0.144
## 67 0.002 0.000 0.039
## 72 0.001 0.001 -0.034
## 91 0.000 0.000 0.018
## 123 0.002 -0.010 0.025
## 141 0.001 0.000 0.040
Observando o boxplot de r.stud, é possivel notar que há residuos com valores acima e abaixo dos limites recomendados. E isto pode estar afetando o ajuste do modelo.
Em alguns casos, para fins didáticos e de simplificação da análise, é útil remover temporariamente observações influentes do modelo. Isso pode ajudar a identificar melhor o comportamento geral do modelo quando as observações problemáticas são removidas. No entanto, é importante ressaltar que a remoção de observações influentes não é recomendada em análises reais, a menos que haja uma justificativa substancial.
A remoção de observações com hat values altos pode ser realizada da seguinte forma:
Identifique as observações com hat values altos, geralmente aquelas cujos hat values estão bem acima da média.
Crie uma nova versão do conjunto de dados, excluindo essas observações.
Realize uma análise separada com o conjunto de dados reduzido, observando as mudanças nos resultados do modelo, como coeficientes e estatísticas de ajuste.
Compare os resultados entre o modelo completo e o modelo com observações influentes removidas para avaliar o impacto dessas observações no ajuste do modelo.
Desta forma, foram realizadas duas tentativas, uma removendo os Hat Values e outra removendo os Resíduos Studentizados, conforme regras supracitadas. Inicialmente testando a remoção dos Hat Values, tem-se o modelo 3, abaixo:
modelo_numStep3 <- update(modelo_numStep2, subset = -a.Hii)
summary(modelo_numStep3)$adj.r.squared
## [1] 0.6243268
summary(modelo_numStep3)
##
## Call:
## lm(formula = total_freight_boxcox ~ product_weight_g + volume +
## dist + tempoEntregaNum + qty_product + total_price + factor(periodo_ano_estima_entrega) +
## volume:factor(periodo_ano_estima_entrega) + total_price:factor(periodo_ano_estima_entrega),
## data = dfNum, subset = -a.Hii)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.83621 -0.11257 0.01048 0.10781 1.28712
##
## Coefficients:
## Estimate Std. Error
## (Intercept) 1.718e+00 2.792e-03
## product_weight_g 3.280e-05 3.524e-07
## volume 1.552e-06 9.423e-08
## dist 2.650e-07 1.212e-09
## tempoEntregaNum 3.648e-03 8.498e-05
## qty_product 2.107e-01 1.464e-03
## total_price 5.067e-04 1.323e-05
## factor(periodo_ano_estima_entrega)2 Tri 2.384e-02 2.697e-03
## factor(periodo_ano_estima_entrega)3 Tri 4.649e-02 2.660e-03
## factor(periodo_ano_estima_entrega)4 Tri 3.577e-03 3.190e-03
## volume:factor(periodo_ano_estima_entrega)2 Tri 1.967e-08 1.105e-07
## volume:factor(periodo_ano_estima_entrega)3 Tri 1.251e-06 1.100e-07
## volume:factor(periodo_ano_estima_entrega)4 Tri 2.560e-07 1.350e-07
## total_price:factor(periodo_ano_estima_entrega)2 Tri -3.923e-05 1.668e-05
## total_price:factor(periodo_ano_estima_entrega)3 Tri 4.630e-06 1.658e-05
## total_price:factor(periodo_ano_estima_entrega)4 Tri 3.634e-06 1.997e-05
## t value Pr(>|t|)
## (Intercept) 615.396 <2e-16 ***
## product_weight_g 93.075 <2e-16 ***
## volume 16.473 <2e-16 ***
## dist 218.639 <2e-16 ***
## tempoEntregaNum 42.923 <2e-16 ***
## qty_product 143.899 <2e-16 ***
## total_price 38.307 <2e-16 ***
## factor(periodo_ano_estima_entrega)2 Tri 8.840 <2e-16 ***
## factor(periodo_ano_estima_entrega)3 Tri 17.476 <2e-16 ***
## factor(periodo_ano_estima_entrega)4 Tri 1.121 0.2621
## volume:factor(periodo_ano_estima_entrega)2 Tri 0.178 0.8587
## volume:factor(periodo_ano_estima_entrega)3 Tri 11.369 <2e-16 ***
## volume:factor(periodo_ano_estima_entrega)4 Tri 1.896 0.0579 .
## total_price:factor(periodo_ano_estima_entrega)2 Tri -2.352 0.0187 *
## total_price:factor(periodo_ano_estima_entrega)3 Tri 0.279 0.7800
## total_price:factor(periodo_ano_estima_entrega)4 Tri 0.182 0.8556
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1934 on 91985 degrees of freedom
## Multiple R-squared: 0.6244, Adjusted R-squared: 0.6243
## F-statistic: 1.019e+04 on 15 and 91985 DF, p-value: < 2.2e-16
summary(modelo_numStep3)$sigma^2
## [1] 0.03740126
vif(modelo_numStep3)
## there are higher-order terms (interactions) in this model
## consider setting type = 'predictor'; see ?vif
## GVIF Df GVIF^(1/(2*Df))
## product_weight_g 2.494287 1 1.579331
## volume 5.945162 1 2.438270
## dist 1.250247 1 1.118145
## tempoEntregaNum 1.312416 1 1.145607
## qty_product 1.009919 1 1.004947
## total_price 5.541007 1 2.353934
## factor(periodo_ano_estima_entrega) 13.109893 3 1.535559
## volume:factor(periodo_ano_estima_entrega) 16.988676 3 1.603344
## total_price:factor(periodo_ano_estima_entrega) 30.410114 3 1.766728
O modelo 3, sem os Hatvalues com valor acima do threshold determinado (4*p/n), tem o R2 ajustado de 0.624, inferior ao R2 ajustado que tinha no modelo 2, e o termo do erro em 0.037, ganho pouco significativo em relação ao modelo 2 que havia 0.042. No modelo 3 não se observa multicolinearidade e as variaveis selecionadas seguem sendo significativas para explicar o valor do frete. Por fim, ao realizar um teste KS para checar a normalidade dos resíduos do modelo 3, e a hipótese nula segue sendo rejeitada.
ks.test(modelo_numStep3$residuals, "pnorm", mean=mean(modelo_numStep3$residuals), sd=sd(modelo_numStep3$residuals))
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: modelo_numStep3$residuals
## D = 0.049399, p-value < 2.2e-16
## alternative hypothesis: two-sided
Uma segunda tentativa foi feita removendo observações cujo, Residuo Studentizado em modulo, fosse superior a 2, formando o modelo 3b:
modelo_numStep3b <- update(modelo_numStep2, subset = -a.r.stud)
summary(modelo_numStep3b)$adj.r.squared #[1] 0.7414162
## [1] 0.7414162
summary(modelo_numStep3b)
##
## Call:
## lm(formula = total_freight_boxcox ~ product_weight_g + volume +
## dist + tempoEntregaNum + qty_product + total_price + factor(periodo_ano_estima_entrega) +
## volume:factor(periodo_ano_estima_entrega) + total_price:factor(periodo_ano_estima_entrega),
## data = dfNum, subset = -a.r.stud)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.85069 -0.10347 0.01324 0.10447 0.44836
##
## Coefficients:
## Estimate Std. Error
## (Intercept) 1.717e+00 2.107e-03
## product_weight_g 3.112e-05 2.720e-07
## volume 1.604e-06 6.282e-08
## dist 2.755e-07 1.007e-09
## tempoEntregaNum 3.387e-03 6.676e-05
## qty_product 2.280e-01 1.128e-03
## total_price 2.975e-04 7.137e-06
## factor(periodo_ano_estima_entrega)2 Tri 2.100e-02 1.963e-03
## factor(periodo_ano_estima_entrega)3 Tri 4.565e-02 1.952e-03
## factor(periodo_ano_estima_entrega)4 Tri 3.928e-03 2.279e-03
## volume:factor(periodo_ano_estima_entrega)2 Tri -5.426e-08 7.103e-08
## volume:factor(periodo_ano_estima_entrega)3 Tri 9.245e-07 7.172e-08
## volume:factor(periodo_ano_estima_entrega)4 Tri 3.191e-07 8.101e-08
## total_price:factor(periodo_ano_estima_entrega)2 Tri -1.067e-05 8.858e-06
## total_price:factor(periodo_ano_estima_entrega)3 Tri 6.317e-06 8.874e-06
## total_price:factor(periodo_ano_estima_entrega)4 Tri -1.105e-05 1.036e-05
## t value Pr(>|t|)
## (Intercept) 814.822 < 2e-16 ***
## product_weight_g 114.412 < 2e-16 ***
## volume 25.534 < 2e-16 ***
## dist 273.552 < 2e-16 ***
## tempoEntregaNum 50.737 < 2e-16 ***
## qty_product 202.187 < 2e-16 ***
## total_price 41.691 < 2e-16 ***
## factor(periodo_ano_estima_entrega)2 Tri 10.700 < 2e-16 ***
## factor(periodo_ano_estima_entrega)3 Tri 23.384 < 2e-16 ***
## factor(periodo_ano_estima_entrega)4 Tri 1.723 0.0848 .
## volume:factor(periodo_ano_estima_entrega)2 Tri -0.764 0.4450
## volume:factor(periodo_ano_estima_entrega)3 Tri 12.891 < 2e-16 ***
## volume:factor(periodo_ano_estima_entrega)4 Tri 3.938 8.21e-05 ***
## total_price:factor(periodo_ano_estima_entrega)2 Tri -1.204 0.2284
## total_price:factor(periodo_ano_estima_entrega)3 Tri 0.712 0.4766
## total_price:factor(periodo_ano_estima_entrega)4 Tri -1.066 0.2863
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1616 on 90608 degrees of freedom
## Multiple R-squared: 0.7415, Adjusted R-squared: 0.7414
## F-statistic: 1.732e+04 on 15 and 90608 DF, p-value: < 2.2e-16
summary(modelo_numStep3b)$sigma^2
## [1] 0.02612802
anova(modelo_numStep3b)
## Analysis of Variance Table
##
## Response: total_freight_boxcox
## Df Sum Sq Mean Sq F value
## product_weight_g 1 2361.24 2361.24 90371.956
## volume 1 55.28 55.28 2115.584
## dist 1 2854.17 2854.17 109238.010
## tempoEntregaNum 1 41.95 41.95 1605.475
## qty_product 1 1184.29 1184.29 45326.526
## total_price 1 234.58 234.58 8978.272
## factor(periodo_ano_estima_entrega) 3 50.03 16.68 638.296
## volume:factor(periodo_ano_estima_entrega) 3 7.68 2.56 97.921
## total_price:factor(periodo_ano_estima_entrega) 3 0.17 0.06 2.143
## Residuals 90608 2367.41 0.03
## Pr(>F)
## product_weight_g < 2e-16 ***
## volume < 2e-16 ***
## dist < 2e-16 ***
## tempoEntregaNum < 2e-16 ***
## qty_product < 2e-16 ***
## total_price < 2e-16 ***
## factor(periodo_ano_estima_entrega) < 2e-16 ***
## volume:factor(periodo_ano_estima_entrega) < 2e-16 ***
## total_price:factor(periodo_ano_estima_entrega) 0.09251 .
## Residuals
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
vif(modelo_numStep3b)
## there are higher-order terms (interactions) in this model
## consider setting type = 'predictor'; see ?vif
## GVIF Df GVIF^(1/(2*Df))
## product_weight_g 3.158691 1 1.777271
## volume 6.437413 1 2.537206
## dist 1.215481 1 1.102489
## tempoEntregaNum 1.272194 1 1.127916
## qty_product 1.012168 1 1.006066
## total_price 5.991190 1 2.447691
## factor(periodo_ano_estima_entrega) 5.474447 3 1.327568
## volume:factor(periodo_ano_estima_entrega) 12.543758 3 1.524303
## total_price:factor(periodo_ano_estima_entrega) 17.032601 3 1.604034
O modelo 3b, sem os registros cujo valor absoluto do Residuo Studentizado é maior que 2, trouxe um R2 Ajustado de 0.741, comparado ao 0.64, tem um ganho significativo além de uma redução no termo do erro, que sai de 0.037, para 0.026. Porém, a hipotese nula do teste de normalidade segue sendo rejeitada mais uma vez.
ks.test(modelo_numStep3b$residuals, "pnorm", mean=mean(modelo_numStep3b$residuals), sd=sd(modelo_numStep3b$residuals))
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: modelo_numStep3b$residuals
## D = 0.042652, p-value < 2.2e-16
## alternative hypothesis: two-sided
Vale ressaltar que em ambas as tentativas de modelos, partiram do modelo 2, onde fez-se a transformação de box-cox.
Foram analisados outros indicadores:
A Distância de Cook é uma métrica que avalia o impacto de cada observação nos coeficientes do modelo de regressão e nas previsões. Ela é calculada para cada observação e quantifica o quanto a previsão do modelo mudaria se a observação fosse removida do conjunto de dados. Em outras palavras, a Distância de Cook mede o quanto uma observação influencia o modelo. Observações com valores elevados de Distância de Cook podem ser consideradas influentes, pois têm um impacto desproporcional nas estimativas do modelo. Valores significativamente maiores que 1 indicam que a observação está exercendo uma influência substancial no modelo.
Os DFBETAS são estatísticas que medem o efeito de cada observação nos coeficientes do modelo. Eles indicam quanto a inclusão ou exclusão de uma observação altera os valores dos coeficientes. DFBETAS podem ser usados para identificar observações que têm um impacto substancial em um ou mais coeficientes. Valores absolutos de DFBETAS significativamente maiores que 1 indicam observações influentes.
Os DFBITs são semelhantes aos DFBETAS, mas medem o efeito de cada observação nos valores ajustados do modelo. Eles indicam quanto a inclusão ou exclusão de uma observação altera as previsões do modelo. DFBITs são úteis para identificar observações que têm um impacto substancial nas previsões do modelo. Valores absolutos de DFBITs significativamente maiores que 1 indicam observações influentes.
ols_plot_cooksd_bar(modelo_numStep2)
ols_plot_cooksd_chart(modelo_numStep2)
ols_plot_dfbetas(modelo_numStep2)
ols_plot_dffits(modelo_numStep2)
Os registros que tinham estes demais indicadores altos, tambem haviam sido observados com Hat Values ou Residuos Studentizados alto, desta maneira nao foi feita nenhuma outra tentativa de modelagem a partir de remoção de obervações influentes.
É importante notar que a remoção de observações influentes é uma medida extrema e deve ser feita com cautela. Em uma análise real, as observações não devem ser removidas a menos que haja uma razão substancial para fazê-lo, como a identificação de erros de medição evidentes ou valores atípicos que não fazem sentido no contexto do estudo.
A análise de observações influentes é uma etapa valiosa na avaliação da robustez do modelo de regressão, mas as conclusões e decisões devem ser baseadas em uma compreensão cuidadosa do conjunto de dados e do problema em questão.
Mesmo utilizando um apelo puramente didático, ainda não conseguiu-se chegar a um modelo cujos resíduos respeitem a distribuição normal, mais uma tentativa foi realizada.
Além de considerar a transformação da variável dependente (como discutido na sessão anterior), também é importante avaliar a necessidade de transformar as variáveis preditoras em um modelo de regressão linear múltipla. A transformação de Box-Tidwell é uma técnica que permite lidar com variáveis independentes que não exibem uma relação linear adequada com a variável dependente. Essa transformação é particularmente útil quando a relação entre uma variável preditora contínua e a variável dependente não é linear, mas pode ser tornada linear através de uma transformação adequada.
A Transformação de Box-Tidwell é uma técnica que consiste em aplicar uma transformação específica a uma variável preditora contínua, geralmente a variável independente com uma relação não linear com a variável dependente, a fim de tornar a relação linear. A transformação é feita através de uma função específica, que é determinada pelos logaritmos naturais da variável preditora e da variável dependente.
Identificação da Variável a Ser Transformada: Primeiro, identificamos a variável preditora que exibe uma relação não linear com a variável dependente e que pode se beneficiar da transformação.
Cálculo dos Logaritmos Naturais: Calculamos o logaritmo natural da variável preditora e da variável dependente.
Regressão Linear: Realizamos uma regressão linear entre o logaritmo natural da variável dependente (log(y)) e a variável preditora transformada (log(x)).
Avaliação dos Coeficientes: A inclinação (coeficiente) da variável preditora transformada na regressão linear fornece informações sobre a relação entre a variável preditora original e a variável dependente. O coeficiente deve ser interpretado com base nos logaritmos naturais das variáveis originais.
modelo_numStep4 <- boxTidwell(total_freight_boxcox ~ product_weight_g+volume+dist+tempoEntregaNum+qty_product+total_price, other.x=~ factor(periodo_ano_estima_entrega), data=dfNum)
modelo_numStep4
## MLE of lambda Score Statistic (t) Pr(>|t|)
## product_weight_g 0.55142 -49.198 < 2.2e-16 ***
## volume 1.20836 11.756 < 2.2e-16 ***
## dist 0.35354 -112.159 < 2.2e-16 ***
## tempoEntregaNum -0.63776 -25.596 < 2.2e-16 ***
## qty_product 0.11925 -55.778 < 2.2e-16 ***
## total_price 0.37544 -50.376 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## iterations = 8
##
## Score test for null hypothesis that all lambdas = 1:
## F = 4625.8, df = 6 and 94979, Pr(>F) = < 2.2e-16
dfNum$product_weight_g_boxTidwell <- (dfNum$product_weight_g^0.55142 - 1)/0.55142
dfNum$volume_boxTidwell <- (dfNum$volume^1.20836 - 1)/1.20836
dfNum$dist_boxTidwell <- (dfNum$dist^0.35354 - 1)/0.35354
dfNum$tempoEntregaNum_boxTidwell <- (dfNum$tempoEntregaNum^(-0.63776) - 1)/(-0.63776)
dfNum$qty_product_boxTidwell <- (dfNum$qty_product^0.11925 - 1)/0.11925
dfNum$total_price_boxTidwell <- (dfNum$total_price^0.37544 - 1)/0.37544
A transformação de Box-Tidwell é uma ferramenta útil para tornar as relações entre variáveis preditoras contínuas e a variável dependente mais adequadas à regressão linear. Ela pode ser uma abordagem eficaz para melhorar o ajuste do modelo e a interpretabilidade dos resultados. No entanto, é fundamental realizar essa transformação com base na compreensão do domínio e nas características dos dados.
Partindo do modelo de regressao linear multipla que teve o melhor R2 Ajustado e menor Sigma2, que foi o modelo 3b (com y transformado por box-cox e sem as observações cujo R.stud em modulo seja maior que 2), foi feita mais uma tentativa, agora transformando as variaveis preditoras. Será chamado no texto de Modelo 4.
modelo_num5 <- lm(total_freight_boxcox ~ product_weight_g_boxTidwell+volume_boxTidwell+dist_boxTidwell+tempoEntregaNum_boxTidwell+qty_product_boxTidwell+total_price_boxTidwell+factor(periodo_ano_estima_entrega)+total_price_boxTidwell:factor(periodo_ano_estima_entrega)+volume_boxTidwell:factor(periodo_ano_estima_entrega), data=dfNum)
modelo_numStep6 <- update(modelo_num5, subset = -a.r.stud)
modelo_numStep7 <- step(modelo_numStep6, direction = 'both', k = log(n))
## Start: AIC=-355881.7
## total_freight_boxcox ~ product_weight_g_boxTidwell + volume_boxTidwell +
## dist_boxTidwell + tempoEntregaNum_boxTidwell + qty_product_boxTidwell +
## total_price_boxTidwell + factor(periodo_ano_estima_entrega) +
## total_price_boxTidwell:factor(periodo_ano_estima_entrega) +
## volume_boxTidwell:factor(periodo_ano_estima_entrega)
##
## Df Sum of Sq RSS
## <none> 1781.9
## - total_price_boxTidwell:factor(periodo_ano_estima_entrega) 3 0.75 1782.6
## - volume_boxTidwell:factor(periodo_ano_estima_entrega) 3 3.43 1785.3
## - tempoEntregaNum_boxTidwell 1 29.11 1811.0
## - product_weight_g_boxTidwell 1 349.56 2131.5
## - qty_product_boxTidwell 1 1037.02 2818.9
## - dist_boxTidwell 1 1857.90 3639.8
## AIC
## <none> -355882
## - total_price_boxTidwell:factor(periodo_ano_estima_entrega) -355878
## - volume_boxTidwell:factor(periodo_ano_estima_entrega) -355742
## - tempoEntregaNum_boxTidwell -354425
## - product_weight_g_boxTidwell -339660
## - qty_product_boxTidwell -314326
## - dist_boxTidwell -291165
summary(modelo_numStep7)$adj.r.squared
## [1] 0.8053689
summary(modelo_numStep7)
##
## Call:
## lm(formula = total_freight_boxcox ~ product_weight_g_boxTidwell +
## volume_boxTidwell + dist_boxTidwell + tempoEntregaNum_boxTidwell +
## qty_product_boxTidwell + total_price_boxTidwell + factor(periodo_ano_estima_entrega) +
## total_price_boxTidwell:factor(periodo_ano_estima_entrega) +
## volume_boxTidwell:factor(periodo_ano_estima_entrega), data = dfNum,
## subset = -a.r.stud)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.60894 -0.08482 -0.00036 0.08566 0.65741
##
## Coefficients:
## Estimate
## (Intercept) 1.449e+00
## product_weight_g_boxTidwell 1.248e-03
## volume_boxTidwell 1.999e-07
## dist_boxTidwell 1.586e-03
## tempoEntregaNum_boxTidwell 1.157e-01
## qty_product_boxTidwell 4.041e-01
## total_price_boxTidwell 9.922e-03
## factor(periodo_ano_estima_entrega)2 Tri 1.637e-02
## factor(periodo_ano_estima_entrega)3 Tri 3.121e-02
## factor(periodo_ano_estima_entrega)4 Tri -7.191e-03
## total_price_boxTidwell:factor(periodo_ano_estima_entrega)2 Tri 4.232e-04
## total_price_boxTidwell:factor(periodo_ano_estima_entrega)3 Tri 1.424e-03
## total_price_boxTidwell:factor(periodo_ano_estima_entrega)4 Tri 4.594e-04
## volume_boxTidwell:factor(periodo_ano_estima_entrega)2 Tri -2.509e-09
## volume_boxTidwell:factor(periodo_ano_estima_entrega)3 Tri 7.431e-08
## volume_boxTidwell:factor(periodo_ano_estima_entrega)4 Tri 2.468e-08
## Std. Error
## (Intercept) 3.823e-03
## product_weight_g_boxTidwell 9.360e-06
## volume_boxTidwell 5.581e-09
## dist_boxTidwell 5.159e-06
## tempoEntregaNum_boxTidwell 3.006e-03
## qty_product_boxTidwell 1.760e-03
## total_price_boxTidwell 1.939e-04
## factor(periodo_ano_estima_entrega)2 Tri 3.136e-03
## factor(periodo_ano_estima_entrega)3 Tri 3.104e-03
## factor(periodo_ano_estima_entrega)4 Tri 3.613e-03
## total_price_boxTidwell:factor(periodo_ano_estima_entrega)2 Tri 2.505e-04
## total_price_boxTidwell:factor(periodo_ano_estima_entrega)3 Tri 2.484e-04
## total_price_boxTidwell:factor(periodo_ano_estima_entrega)4 Tri 2.880e-04
## volume_boxTidwell:factor(periodo_ano_estima_entrega)2 Tri 6.704e-09
## volume_boxTidwell:factor(periodo_ano_estima_entrega)3 Tri 6.809e-09
## volume_boxTidwell:factor(periodo_ano_estima_entrega)4 Tri 7.645e-09
## t value Pr(>|t|)
## (Intercept) 378.924 < 2e-16
## product_weight_g_boxTidwell 133.323 < 2e-16
## volume_boxTidwell 35.824 < 2e-16
## dist_boxTidwell 307.364 < 2e-16
## tempoEntregaNum_boxTidwell 38.470 < 2e-16
## qty_product_boxTidwell 229.633 < 2e-16
## total_price_boxTidwell 51.176 < 2e-16
## factor(periodo_ano_estima_entrega)2 Tri 5.222 1.78e-07
## factor(periodo_ano_estima_entrega)3 Tri 10.055 < 2e-16
## factor(periodo_ano_estima_entrega)4 Tri -1.990 0.04657
## total_price_boxTidwell:factor(periodo_ano_estima_entrega)2 Tri 1.690 0.09106
## total_price_boxTidwell:factor(periodo_ano_estima_entrega)3 Tri 5.734 9.83e-09
## total_price_boxTidwell:factor(periodo_ano_estima_entrega)4 Tri 1.595 0.11069
## volume_boxTidwell:factor(periodo_ano_estima_entrega)2 Tri -0.374 0.70824
## volume_boxTidwell:factor(periodo_ano_estima_entrega)3 Tri 10.913 < 2e-16
## volume_boxTidwell:factor(periodo_ano_estima_entrega)4 Tri 3.229 0.00124
##
## (Intercept) ***
## product_weight_g_boxTidwell ***
## volume_boxTidwell ***
## dist_boxTidwell ***
## tempoEntregaNum_boxTidwell ***
## qty_product_boxTidwell ***
## total_price_boxTidwell ***
## factor(periodo_ano_estima_entrega)2 Tri ***
## factor(periodo_ano_estima_entrega)3 Tri ***
## factor(periodo_ano_estima_entrega)4 Tri *
## total_price_boxTidwell:factor(periodo_ano_estima_entrega)2 Tri .
## total_price_boxTidwell:factor(periodo_ano_estima_entrega)3 Tri ***
## total_price_boxTidwell:factor(periodo_ano_estima_entrega)4 Tri
## volume_boxTidwell:factor(periodo_ano_estima_entrega)2 Tri
## volume_boxTidwell:factor(periodo_ano_estima_entrega)3 Tri ***
## volume_boxTidwell:factor(periodo_ano_estima_entrega)4 Tri **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1402 on 90608 degrees of freedom
## Multiple R-squared: 0.8054, Adjusted R-squared: 0.8054
## F-statistic: 2.5e+04 on 15 and 90608 DF, p-value: < 2.2e-16
summary(modelo_numStep7)$sigma^2
## [1] 0.01966606
Neste modelo, com tanto as variaveis explicativas quanto a variavel dependente transformada, chega-se a um R2 Ajustado de 0.805 e um sigma2 de 0.0197, sendo desta maneira os melhores indicares até o momento.
Mais uma vez é necessário testar a normalidade dos resíduos obtidos a partir do modelo 4. Obtem-se um QQPlot com uma aparencia mais ajustada, porém com as extremidades ainda descoladas. E ao realizar o teste de Kolmogorov-Smirnov, segue-se rejeitando a hipótese nula de normalidade dos residuos
residuos7 <- modelo_numStep7$residuals #Calcula o vetor de residuos
preditos7 <- predict(modelo_numStep7) #Calcula os valores preditos
qqnorm(residuos7) ; qqline(residuos7) #Grafico de probabilidade normal
ks.test(residuos7, "pnorm", mean=mean(residuos7), sd=sd(residuos7))
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: residuos7
## D = 0.023555, p-value < 2.2e-16
## alternative hypothesis: two-sided
O mesmo foi necessario fazer para homocedacidade. O gráfico de Ajustados vs. Residuos, segue com a mesma aparencia de nuvem com uma leve impressão de que a variância aumenta na região central do gráfico, e depois reduz novamente. O teste de Breusch-Pagan serve para ratificar a impressão visual e confirmar a heterocedacidade.
plot(preditos7, residuos7, main="Ajustados vs. Residuos")
abline(h=0)
bptest(modelo_numStep7)
##
## studentized Breusch-Pagan test
##
## data: modelo_numStep7
## BP = 7810.9, df = 15, p-value < 2.2e-16
Conclui-se que mesmo testando diversas técnicas o frete não se relaciona linearmente com as demais variáveis, e há ressalvas quanto ao uso dos modelos propostos para previsão do frete de um novo pedido realizado neste market place. O melhor modelo obtido do ponto de vista de explicabilidade das variveis e redução do termo do erro, tem uma interpretação extremamente complexa, e é muito dificil para um ser humano médio interpretar como um grama adicional ou um cm3 adicional em produto comprado, vai impactar em reais no valor do frete. Mesmo com os ganhos do ponto de vista matemático, para o uso corriqueiro e nao automatizado, recomenda-se o uso do modelo 1. Caso seja possível automatizar a entrada de dados e transformar para visualização em reais diretos, aí sim, utiliza-se o modelo 4, ambos com ressalvas.